/**
 * TBox Web SDK 工具类
 * 用于管理 TBox SDK 的初始化和销毁
 */

interface TBoxSDKConfig {
  agentId: string
}

class TBoxSDKManager {
  private instance: any = null
  private retryCount = 0
  private readonly MAX_RETRIES = 50
  private retryTimer: ReturnType<typeof setTimeout> | null = null

  /**
   * 初始化 TBox SDK
   * @param config SDK 配置
   * @param isAuthenticated 用户是否已登录
   */
  init(config: TBoxSDKConfig, isAuthenticated: boolean): void {
    // 如果用户未登录，不初始化
    if (!isAuthenticated) {
      return
    }

    // 如果已经初始化，不再重复初始化
    if (this.instance) {
      return
    }

    // 清除之前的重试定时器
    if (this.retryTimer) {
      clearTimeout(this.retryTimer)
      this.retryTimer = null
    }

    if ((window as any).TBoxWebSDK && (window as any).TBoxWebSDK.WebChatClient) {
      try {
        this.instance = new (window as any).TBoxWebSDK.WebChatClient({
          config: {
            agentId: config.agentId
          }
        })
        console.log('TBox Web SDK 初始化成功', this.instance)
        this.retryCount = 0
      } catch (error) {
        console.error('TBox Web SDK 初始化失败:', error)
      }
    } else if (this.retryCount < this.MAX_RETRIES) {
      // 如果 SDK 还未加载，延迟重试
      this.retryCount++
      this.retryTimer = setTimeout(() => {
        this.init(config, isAuthenticated)
      }, 100)
    } else {
      console.warn('TBox Web SDK 加载超时，已达到最大重试次数')
    }
  }

  /**
   * 销毁 TBox SDK 实例
   */
  destroy(): void {
    // 清除重试定时器
    if (this.retryTimer) {
      clearTimeout(this.retryTimer)
      this.retryTimer = null
    }

    // 销毁 SDK 实例
    if (this.instance) {
      try {
        // 尝试销毁 SDK 实例
        if (typeof this.instance.destroy === 'function') {
          this.instance.destroy()
        } else if (typeof this.instance.dispose === 'function') {
          this.instance.dispose()
        }
      } catch (error) {
        console.error('销毁 TBox SDK 失败:', error)
      }
      this.instance = null
    }

    // 清理 TBox SDK 创建的 DOM 元素
    const tboxElements = document.querySelectorAll(
      '.tech-sidetip-button, [class*="tech-"], [id*="tbox"], [id*="TBox"]'
    )
    tboxElements.forEach(el => {
      try {
        el.remove()
      } catch (error) {
        console.error('清理 TBox DOM 元素失败:', error)
      }
    })

    // 重置重试计数
    this.retryCount = 0
  }

  /**
   * 获取当前 SDK 实例
   */
  getInstance(): any {
    return this.instance
  }

  /**
   * 检查 SDK 是否已初始化
   */
  isInitialized(): boolean {
    return this.instance !== null
  }
}

// 导出单例实例
export const tboxSDKManager = new TBoxSDKManager()

// 导出类型
export type { TBoxSDKConfig }

